注意:所有文章除特别说明外,转载请注明出处.
SpringMVC 中的拦截器
Spring提供了HandlerInterceptor
接口和HandlerInterceptorAdapter
适配器。实现这个接口或继承此类,就可以实现自己的拦截器。接口HandlerInterceptor
包含三个方法,每个方法的参数handler
,用来指向下一个拦截器。此类似于Servlet开发中的Filter,用于对请求进行拦截和处理。
1.Spring MVC拦截器使用方法
1.配置文件
定义在springmvc.xml配置下的<mvc:interceptor>
表示对特定的请求进行拦截。
<mvc:interceptors>
<!--对所有的请求进行拦截-->
<!--<beans:beanclass="com.sunp.common.interceptor.Myinterceptor"/>-->
<!--对特定的请求进行拦截-->
<mvc:interceptor>
<!--进行拦截的路径-->
<mvc:mapping path="/**"/>
<!--不进行拦截的路径-->
<mvc:exclude-mapping path="/lib/**" />
<beans:bean class="com.sunp.common.interceptor.Myinterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
2.实现接口并且继承方法(同时包含多个实现类)
public class myInterceptor implements HandlerInterceptor{
@Override
public boolean preHandler(HttpServletRequest request, HttpServletResponse response, Object obj)throws Exception{
//该方法将在请求处理之前进行调用,只有该方法返回true,才会继续执行后续的Interceptor和Controller
//当返回值为true 时就会继续调用下一个Interceptor的preHandle方法
//如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object obj,Exception e)throws Exception {
//在整个请求结束之后被调用,即就是在DispatcherServlet渲染了对应的视图之后执行(用于进行资源清理工作)
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2,ModelAndView arg3) throws Exception {
//该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,
//DispatcherServlet进行视图返回渲染之前进行调用,可以在这个方法中对Controller
//处理之后的ModelAndView 对象进行操作
}
}
备注:
1.preHandle(),在Controller之前执行的预处理,可以进行编码、安全控制等处理
2.postHandle(),在生成View之前执行的后处理,调用了Service并返回ModelAndView,但未进行页面渲染,可以修改ModelAndView
3.afterCompletion(),最后执行的返回处理,这时已经进行了页面渲染,可以进行日志记录、释放资源等处理
所以在实现了接口之后,就可以在配置文件中进行拦截器的配置。然后其执行顺序为:preHandler -> Controller -> postHandler -> model渲染-> afterCompletion
注意:如果配置了
<mvc:annotation-driven/>
,会自动注册DefaultAnnotationHandlerMapping
与AnnotationMethodHandlerAdapter
这两个bean。这样就不能再注入interceptors
属性,也就无法指定拦截器了。
2.应用场景
- 如检测请求是否具有登录权限,如果没有直接返回到登陆页面。
- 可以记录请求信息的日志,以便进行信息监控、信息统计等。